-- phpMyAdmin SQL Dump
-- version 2.11.9.6
-- http://www.phpmyadmin.net
--
-- Servidor: localhost:3306
-- Tiempo de generación: 03-01-2012 a las 17:01:40
-- Versión del servidor: 5.0.68
-- Versión de PHP: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de datos: `soporte_oraculus`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `CATEGORIAS`
--

DROP TABLE IF EXISTS `CATEGORIAS`;
CREATE TABLE IF NOT EXISTS `CATEGORIAS` (
  `ID_CATEGORIA` tinyint(3) NOT NULL auto_increment,
  `CATEGORIA` varchar(25) character set utf8 NOT NULL,
  PRIMARY KEY  (`ID_CATEGORIA`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ;

--
-- Volcar la base de datos para la tabla `CATEGORIAS`
--

INSERT INTO `CATEGORIAS` (`ID_CATEGORIA`, `CATEGORIA`) VALUES
(1, 'OCA'),
(2, 'OCP'),
(3, 'PLSQL'),
(4, 'SQL'),
(5, 'UNIX'),
(6, 'ORACLE'),
(7, 'RAC'),
(8, 'SCRIPTS');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `CAT_ENTRADAS`
--

DROP TABLE IF EXISTS `CAT_ENTRADAS`;
CREATE TABLE IF NOT EXISTS `CAT_ENTRADAS` (
  `ID_ENTRADA` int(11) NOT NULL,
  `ID_SUBCATEGORIA` tinyint(3) NOT NULL,
  `ID_SIGUIENTE` int(11) default NULL,
  `ID_ANTERIOR` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcar la base de datos para la tabla `CAT_ENTRADAS`
--

INSERT INTO `CAT_ENTRADAS` (`ID_ENTRADA`, `ID_SUBCATEGORIA`, `ID_SIGUIENTE`, `ID_ANTERIOR`) VALUES
(31, 33, NULL, NULL),
(42, 39, NULL, NULL),
(41, 38, NULL, NULL),
(40, 38, NULL, NULL),
(39, 37, NULL, NULL),
(38, 36, NULL, NULL),
(36, 35, NULL, NULL),
(44, 41, NULL, NULL);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `ENTRADAS`
--

DROP TABLE IF EXISTS `ENTRADAS`;
CREATE TABLE IF NOT EXISTS `ENTRADAS` (
  `ID_ENTRADA` int(11) NOT NULL auto_increment,
  `ID_USUARIO` tinyint(3) NOT NULL,
  `TITULO` varchar(100) character set utf8 default NULL,
  `DESCRIPCION` varchar(500) character set utf8 default NULL,
  `FECHA` date default NULL,
  `ACTIVO` tinyint(1) NOT NULL,
  PRIMARY KEY  (`ID_ENTRADA`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=45 ;

--
-- Volcar la base de datos para la tabla `ENTRADAS`
--

INSERT INTO `ENTRADAS` (`ID_ENTRADA`, `ID_USUARIO`, `TITULO`, `DESCRIPCION`, `FECHA`, `ACTIVO`) VALUES
(31, 1, 'Trabajar con secuencias', '<div class="desc_parrafo_lista">\r\n    Create sequence.\r\n    Alter sequence.\r\n    Utilizar secuencia.\r\n</div>\r\n	', '2011-12-29', 0),
(36, 1, 'Monitoreo espacio filesystems', '<div class="desc_parrafo_lista">\r\nTipo post: Script\r\n</div>', '2011-12-30', 0),
(38, 1, 'Crear Directorios', '<div class="desc_parrafo_lista">\r\n	Crear directorios, dar permisos.\r\n</div>', '2012-01-01', 0),
(39, 1, 'File Descriptor', '<div class="desc_parrafo_lista">\r\nDefinicion, Tipos, monitoreo.\r\n</div>\r\n', '2012-01-01', 0),
(40, 1, 'Crear Logs', '<div class="desc_parrafo_lista">\r\nTipo: Script Unix\r\n</div>\r\n', '2012-01-01', 0),
(41, 1, 'Ejecutar SQLPLUS desde Linux', '<div class="desc_parrafo_lista">\r\nTipo: Script SQLPLUS\r\n</div>\r\n	', '2012-01-01', 0),
(42, 1, 'Monitorizar uso de la memoria', '<div class="desc_parrafo_lista">\r\nTipo: Script Unix\r\n</div>		', '2012-01-01', 0),
(44, 1, 'TRIGGER para sentencias DML', '<div class="desc_parrafo_lista">\r\nCrear Trigger, Vista relacionada, Parametros.\r\n</div>		', '2012-01-03', 0);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `ENTRADA_TAG`
--

DROP TABLE IF EXISTS `ENTRADA_TAG`;
CREATE TABLE IF NOT EXISTS `ENTRADA_TAG` (
  `ID_ENTRADA` int(11) NOT NULL,
  `ID_TAG` tinyint(3) NOT NULL,
  KEY `ID_ENTRADA` (`ID_ENTRADA`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcar la base de datos para la tabla `ENTRADA_TAG`
--

INSERT INTO `ENTRADA_TAG` (`ID_ENTRADA`, `ID_TAG`) VALUES
(31, 15),
(44, 19),
(42, 21),
(42, 24),
(41, 23),
(40, 22),
(39, 21),
(38, 20),
(38, 19),
(36, 17),
(36, 16),
(36, 18);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `ENTRADA_TEXTO`
--

DROP TABLE IF EXISTS `ENTRADA_TEXTO`;
CREATE TABLE IF NOT EXISTS `ENTRADA_TEXTO` (
  `ID_ENTRADA` int(11) NOT NULL,
  `TEXTO` text character set utf8 NOT NULL,
  KEY `ID_ENTRADA` (`ID_ENTRADA`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcar la base de datos para la tabla `ENTRADA_TEXTO`
--

INSERT INTO `ENTRADA_TEXTO` (`ID_ENTRADA`, `TEXTO`) VALUES
(31, '<h3>1. CREAR SECUENCIA</h3>\r\n\r\n<div class="parrafo" align="justify">\r\nLa sintaxis de para crear una secuencia en Oracle ser&iacute;a:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>CREATE SEQUENCE MiSecuencia\r\n   INCREMENT BY n\r\n   START WITH n\r\n   {MAX VALUE n | NOMAXVALUE}\r\n   {MIN VALUE N | NOMINVALUE}\r\n   {CYCLE | NOCYCLE}\r\n   {CACHE N | NOCACHE}\r\n   {ORDER | NOORDER};\r\n   \r\n</p></pre></blockquote>\r\n\r\n<div class="parrafo" align="justify">\r\nParametros:\r\n</div>\r\n<div class="parrafo" align="justify">\r\nINCREMENT BY n: Indica el incremento que va a haber entre elementos consecutivos de una secuencia va a ser de n unidades. Con este parametro y con los parametros MAX VALUE  y MIN VALUE podemos generar secuencias ascendentes o descendentes, utilizando numeros positivos o negativos. Por defecto es 1.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nSTART WITH n: Ser&aacute; el elemento inicial de la secuencia. Por defecto es 1.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nMAX VALUE: El maximo valor que va a adquirir la secuencia. Tiene que ser mayor o igual que el parametro INCREMENT BY (en valor absoluto). NOMAXVALUE especificamos que el valor maximo de la secuencia sera 10 elevado a 27.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nMIN VALUE: El minimo valor que va a adquirir la secuencia. En el caso de secuencias descendentes sera de -10 elevado a 26.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nCYCLE | NOCYCLE: Configuramos si la secuencia es ciclica o no.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nCACHE n: Indicamos el numero valores que se van a cargar en memoria.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nEjemplo:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT;CREATE SEQUENCE POCO_SECUENCIA\r\nMINVALUE 1\r\nMAXVALUE 100\r\nSTART WITH 1\r\nCYCLE\r\nINCREMENT BY 1 CACHE 20;\r\n\r\n</p></pre></blockquote>\r\n\r\n<h3>2. ALTER SEQUENCE</h3>\r\n<div class="parrafo" align="justify">\r\nUtilizando el ejemplo anterior vamos a modificar la secuencia para que no sea ciclica.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT; ATLER SEQUENCE POCO_SECUENCIA NOCYCLE;\r\n\r\n</p></pre></blockquote>\r\n<h3>3.UTILIZAR SECUENCIA </h3>\r\n<div class="parrafo" align="justify">\r\nPodemos utilizar una secuencia utilizando la propiedad nextval de la secuencia.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT; INSERT INTO POCO_CAMBEST  VALUES (POCO_SECUENCIA.NEXTVAL, ''Prueba'');\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nPara saber en que valor se encuntra la secuencia podremos hacer:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT; SELECT POCO_SECUENCIA.nextval FROM dual;\r\n\r\n</p></pre></blockquote>\r\n\r\n<h3>4.VISTAS RELACIONADAS </h3>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT;  select table_name from dictionary where table_name like ''%SEQUENCES%'';\r\n\r\nTABLE_NAME\r\n------------------------------\r\nUSER_SEQUENCES\r\nALL_SEQUENCES\r\nDBA_SEQUENCES\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nPara ver la estructura de una de estas tablas haremos:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT; DESC USER_SEQUENCES\r\n\r\nSEQUENCE_NAME                            NOT NULL VARCHAR2(30)\r\nMIN_VALUE                                 NUMBER\r\nMAX_VALUE                                 NUMBER\r\nINCREMENT_BY                             NOT NULL NUMBER\r\nCYCLE_FLAG                                VARCHAR2(1)\r\nORDER_FLAG                                VARCHAR2(1)\r\nCACHE_SIZE                               NOT NULL NUMBER\r\nLAST_NUMBER                              NOT NULL NUMBER\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nComo valor rese&ntilde;able esta la columna LAST_NUMBER. El valor almacenado en esta columna se actualiza cada vez que se recarga la cache de la secuencia.\r\n</div>'),
(36, '<div class="parrafo" align="justify">\r\nEl script que podemos utilizar para el monitoreo de la ocupacion de nuestros filesystems es:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>THRESHOLD=95\r\ndf -H -P | grep -vE ''^Filesystem|tmpfs'' | awk ''{ print $5 " " $1 }'' | grep -v docs | while read output;\r\ndo\r\n  fspace=$(echo $output | awk ''{ print $1}'' | cut -d''%'' -f1  )\r\n  fs=$(echo $output | awk ''{ print $2 }'' )\r\n  if [ $fspace -ge $THRESHOLD ]; then\r\n    echo "WARNING Nos quedamos sin espacio "$fs ($fspace%)" on $(hostname) as on $(date)"\r\n  fi\r\ndone\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nComo vemos la variable THRESHOLD se edita para recibir un mensaje de Warning cuando la ocupacion supera ese umbral.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nEste script puede ser util, cuando por el motivo que sea estamos generando mucho Redo y para evitar que se nos llene el filesystem de los archiver.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nPara hacer automatica la ejecucion de este script lo podemos meter en un bucle while true y utilizando el comando sleep.\r\n</div>\r\n'),
(38, '<div class="parrafo" align="justify">\r\nUn consejo antes de modificar algun valor de vuestra base de datos es aseguraros una marcha atras, vamos un backup de la tabla o tablas que se van a modificar, simplemente para aseguraros que dejais la base de datos tal y como estaba en el caso que las cosas no salgan como habiais previsto.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nPara realizar este backup, podemos utilizar varios metodos, pero yo principalmente prefiero usas el mecanismo de Import/Export que proporciona Oracle. Inicialmente se utilizaba los comandos exp e imp, pero con la utilidad DataPump da mucha mas flexibilidad.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nAntes de empezar a utilizar el export con DataPump tenemos que crear el directorio o directorios donde vamos a dejar los ficheros resultantes. Un directorio en Oracle es un objeto de base de datos asociado a un path fisico.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nLos pasos que hago antes de hacer un export son:\r\n</div>\r\n<div class="parrafo" align="justify">\r\n1.- Miramos en el arbol de directorios donde dejar nuestros ficheros.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>> df -h\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\n2.- Creamos el directorio\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&gt; CREATE DIRECTORY DUMP_DIR AS ''/u01/app/oracle/backup'';\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\n3.- Damos permisos de escritura\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&gt; GRANT read, write ON DIRECTORY DUMP_DIR TO MOGU;\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\n3.- Lanzamos el expdp\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>> nohup expdp parfile=\\''export_file.txt\\'' &\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nLa vista que aporta informacion sobre los directorios de Oracle es ALL_DIRECTORIES.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT; desc ALL_DIRECTORIES\r\n Name                                  	Null?	Type\r\n ----------------------------------------- -------- ----------------------------\r\n OWNER                                 	NOT NULL VARCHAR2(30)\r\n DIRECTORY_NAME                       	NOT NULL VARCHAR2(30)\r\n DIRECTORY_PATH                        VARCHAR2(4000)\r\n \r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nPara borrar directorios haremos:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>\r\nSQL&GT; DROP DIRECTORY DUMP_DIR;\r\n</p></pre></blockquote>\r\n'),
(39, '<div class="parrafo" align="justify">\r\nLos file descriptor es un numero provisto por el sistema operativo, con el cual los procesos pueden mandar bytes. En Unix muchas cosas pueden ser File Descriptor:\r\n<div class="parrafo_lista_sub">\r\n-- Pipes</br>\r\n-- Sockets</br>\r\n-- FIFOs</br>\r\n-- Conexiones con perifericos\r\n</div>\r\n</div>\r\n<div class="parrafo" align="justify">\r\nLos primeros file descriptos que tiene el sistema son\r\n<div class="parrafo_lista_sub">\r\n0 - Entrada estandar</br>\r\n1 - Salida estandar</br>\r\n2 - Salida de error</br>\r\n</div>\r\n</div>\r\n<div class="parrafo" align="justify">\r\nSi abriesemos otro fichero inmediatamente le asignaria el FD 3.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nLas operaciones basicas que se realizan sobre los FD son:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>read(fd, buffer, tam)\r\nwrite(fd, buffer, tam)\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nEl numero de file descriptor es un parametro que se define en /etc/sysctl.conf\r\nTambien podemos saber donde se encuentra el numero maximo de file descriptor de nuestro kernel mirando:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>> more /proc/sys/fs/file-max\r\n> 8192\r\n\r\no\r\n\r\n> sysctl -a | grep fs.file-max\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nPara mirar el numero de FD que actualmente estan siendo usados haremos:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>> more /proc/sys/fs/file-nr\r\n> 8191\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nPara saber cuantos ficheros hay abiertos haremos\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>> lsof | wc -l\r\n> 10325\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nEn teoria los dos numeros anteriores deberian de ser iguales pero nos podemos encontrar que un file descriptor apunte a varios ficheros a la vez.\r\n</div>\r\n<div class="parrafo" align="justify">\r\nPara saber cuantos file descriptor tiene abierto un determinado proceso haremos:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>>ps -fea | grep oracle\r\n> 28290\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nEste peque&ntilde;o script te muestra como se distribuyen los FD entre los difernetes procesos de oracle:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>ps -fea | grep oracle | grep -v grep | while read salida\r\ndo\r\n pid=`echo $salida | awk ''{print $2}''`\r\n fd=`/usr/sbin/lsof -p $pid | wc -l`\r\n proces=`echo $salida | awk ''{print $8}''`\r\n echo "PID: ${pid}, PROCCESS: ${proces}, FD: ${fd}" >>log_fd.txt\r\ndone\r\n\r\nlsof +c 32| perl -lane ''$x{"$F[0]:$F[1]"}++;\r\nEND { print "$x{$_}	$_" for sort {$x{$a}<=>$x{$b}} keys %x}''\r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nPodemos modificar el numero maximo de FD permitidos haciendo:\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>\r\nvi /etc/sysctl.conf\r\n\r\nfs.file-max = 331287\r\n\r\nsysctl &minus;p\r\n</p></pre></blockquote>'),
(40, '<div class="parrafo" align="justify">\r\nEsta funci&oacute;n la desarroll&eacute; para ir registrando en un fichero y sacando a su vez por pantalla los diferentes eventos que se registraban en mis scripts, para ejecutarlo debemos editar la variable FICH_LOG con el nombre del fichero de log que queramos, tambi&eacute;n recomiendo concatenar el nombre del fichero con la variable fec para registrar la hora de ejecuci&oacute;n del script.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>#! /bin/ksh\r\n\r\nfec=`date +%Y%m%d_%H%M%S`\r\nFICH_LOG=export_$fec.log\r\n\r\n##------------------------------------------------##\r\n## Function: LOG\r\n## Funcion que utilizamos para escribir las trazas.\r\n##------------------------------------------------##\r\nfunction LOG {\r\n\r\n     fecha=`date +%H:%M:%S`\r\n     echo "[ $fecha ]    "$1 >> $FICH_LOG\r\n         echo "[ $fecha ]  "$1\r\n\r\n return 0\r\n\r\n}\r\n\r\n##------------------------------------------------##\r\n## MAIN\r\n##------------------------------------------------##\r\n\r\nLOG "-- Prueba LOG"\r\n\r\n</p></pre></blockquote>'),
(41, '<div class="parrafo" align="justify">\r\nPublico el codigo que utilizo para ejecutar scripts o bloques de PLSQL desde UNIX. Con las ventajas de poder ejecutar el script en background y con el control de errores de Oracle ORA-xxxx.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>\r\n#! /bin/ksh\r\n\r\nfec=`date +%Y%m%d_%H%M%S`\r\nFICH_LOG=backup_$fec.log\r\n\r\nSQLPLUS=$ORACLE_HOME/bin/sqlplus; export SQLPLUS\r\nUSRPWD="OPGE/temporal"  export USRPWD\r\n\r\nrm -f /tmp/.backup*.tmp 2>/dev/null\r\nftmp=/tmp/.backup$$_${RANDOM}.tmp\r\n\r\n	$SQLPLUS -s /nolog <<[EOSQL] > $ftmp\r\n	connect $USRPWD;\r\n	set lin 160 pages 500 timing on\r\n	@stats_$tabla.sql\r\n	quit\r\n[EOSQL]\r\n	ca_err=`grep "^ORA-" $ftmp | wc -l`\r\n	if [ $ca_err -gt 0 ]; then\r\n		LOG "ERROR: Ejecutando stats_$tabla.sql"\r\n		cat $ftmp | tee -a $FICH_LOG                 \r\n		exit 1\r\n	fi\r\n	\r\n</p></pre></blockquote>\r\n\r\n<div class="parrafo" align="justify">\r\nUna vez creado el script le damos permisos de ejecucion y lo lanzamos con nohup.\r\n</div>\r\n'),
(42, '<div class="parrafo" align="justify">\r\nEste bucle infinito que muestra cada 4 segundos la utilizacion de la memoria.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>while [ /bin/true ] ; \r\n do \r\n clear \r\n ps aux | sort -rnk 4 | head -n 5 | cat <(echo `date`) - | tee -a high_mem.log \r\n sleep 4 \r\n done\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nDesglosamos algunos de los comandos que estamos utilizando en este script.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>>ps aux\r\n\r\nUSER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nLas columnas que aparecen son:\r\n<div class="parrafo_lista_sub">\r\nUSER: Usuario propietario del proceso.</br>\r\nPID: Identificador del proceso.</br>\r\n%CPU: Porcentaje de utilizacion de la CPU.</br>\r\n%MEN: Porcentaje de la memoria utilizada.</br>\r\nVSZ: Memoria virtual utilizada (kbytes)</br>\r\nRSS: Memoria real utilizada (kbytes).</br>\r\nSTAT: Estado en el que se ecuentra el proceso:\r\n<div class="parrafo_lista_sub">\r\n	-- R running</br>\r\n	-- S sleeping</br>\r\n	-- Z zombie (proceso que ha muerto, pero su padre no se ha hecho cargo)</br>\r\n	-- T stopped.</br>\r\n</div>\r\n</div>\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>>sort -rnk 4\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nsort -- ordena los datos que se le pasan.\r\n<div class="parrafo_lista_sub">\r\n-r de mayor a menor</br>\r\n-n interpreta los datos como si fuesen numeros</br>\r\n-k n ordena los datos segun la columna en la posicion n</br>\r\n</div>\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>>head -n 5\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nEsto nos muestra los 5 primeros elementos.\r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>> cat <(echo `date`) - | tee -a high_mem.log \r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nLa primera parte concatena con a la entrada la fecha. y la segunda tee almacena en el fichero y saca por pantalla el contenido\r\n</div>'),
(44, '<div class="parrafo" align="justify">\r\nEn este post publicamos el c&oacute;mo trabajar con triggers ante eventos producidos por sentencias DML (insert, update, delete). \r\n</div>\r\n<div class="parrafo" align="justify">\r\nUn trigger es un procedimiento o bloque de PLSQL que se ejecutara cuando se den unas determinadas circunstancias. Para poder crear un trigger es necesario que el usuario tenga el privilegio de ADMINISTER DATABASE TRIGGER, ademas el usuario tiene que tener los privilegios nacesarios para ejecutar el procedimiento asociado al trigger. \r\n</div>\r\n<div class="parrafo" align="justify">\r\nSintaxis: \r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>CREATE [OR REPLACE] TRIGGER <trigger_name> \r\n  {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <table_name> \r\n  [REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]] \r\n  [FOR EACH ROW [WHEN (<trigger_condition>)]] \r\n <trigger_body> \r\n \r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\n-- {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <table_name>:Podemos combinar varios disparadores de eventos con el prametro OR \r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>... INSERT ON R ... \r\n... INSERT OR DELETE OR UPDATE ON R ... \r\n   ... UPDATE OF A, B OR INSERT ON R ... \r\n\r\n   </p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nAdemas con el evento de update podemos indicar que columnas de la tabla dispararan el trigger. \r\n</div>\r\n<div class="parrafo" align="justify">\r\n-FOR EACH ROW [WHEN (<trigger_condition>)]] :Con esta clausula hacemos que el trigguer evale cada una de las filas afectadas por la sentencia DML y ejecute el bloque de PLSQL, si se cumple trigger_condition. \r\n</div>\r\n<div class="parrafo" align="justify">\r\n-<trigger_body>: En el cuerpo del trigguer NEW y OLD deben de precederse por :\r\n</div>\r\n<div class="parrafo" align="justify">\r\n-[REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]] Utilizaremos esta clausula para asignar nuevos valores a las variables NEW y OLD. \r\n</div>\r\n\r\n<h3>EJEMPLOS: </h3>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL> CREATE TRIGGER trig1 \r\n    AFTER INSERT ON T4 \r\n    REFERENCING NEW AS newRow \r\n    FOR EACH ROW \r\n    WHEN (newRow.a <= 10) \r\n    BEGIN \r\n        INSERT INTO T5 VALUES(:newRow.b, :newRow.a); \r\n    END trig1;\r\n	\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nEn el caso de que el bloque de PLSQL tenga errores de sintaxis recibiremos este warning: Trigger created with compilation errors. Para obtener mas informacion de los errores haremos: \r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL> SHOW ERRORS TRIGGER <trigger_name>; \r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nPara habilitar o deshabilitar triggers haremos: \r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT; ALTER TRIGGER MiTrigger ENABLE|DISABLE; \r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nLa vista que proporciona Oracle para obtener informacion de nuestros listener es USER_TRIGGERS: \r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT; select \r\n    trigger_type, \r\n    triggering_event, \r\n    table_name, \r\n    referencing_names, \r\n    trigger_body \r\nfrom user_triggers \r\nwhere trigger_name = ''<trigger_name>''; \r\n\r\n</p></pre></blockquote>\r\n<div class="parrafo" align="justify">\r\nPara borrar un trigger haremos: \r\n</div>\r\n<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">\r\n<pre><p>SQL&GT; DROP TRIGGER <trigger_name>; \r\n</p></pre></blockquote>');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `SUBCATEGORIAS`
--

DROP TABLE IF EXISTS `SUBCATEGORIAS`;
CREATE TABLE IF NOT EXISTS `SUBCATEGORIAS` (
  `ID_SUBCATEGORIA` tinyint(3) NOT NULL auto_increment,
  `ID_CATEGORIA` tinyint(3) NOT NULL,
  `SUBCATEGORIA` varchar(25) character set utf8 NOT NULL,
  PRIMARY KEY  (`ID_SUBCATEGORIA`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=42 ;

--
-- Volcar la base de datos para la tabla `SUBCATEGORIAS`
--

INSERT INTO `SUBCATEGORIAS` (`ID_SUBCATEGORIA`, `ID_CATEGORIA`, `SUBCATEGORIA`) VALUES
(33, 4, 'DDL'),
(35, 5, 'Ficheros'),
(36, 6, 'DataPump'),
(37, 5, 'Recursos'),
(38, 8, 'Generales'),
(39, 8, 'Monitorizar'),
(40, 4, 'Objetos'),
(41, 4, 'DML');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `TAGS`
--

DROP TABLE IF EXISTS `TAGS`;
CREATE TABLE IF NOT EXISTS `TAGS` (
  `ID_TAG` tinyint(3) NOT NULL auto_increment,
  `TAG` varchar(50) character set utf8 NOT NULL,
  PRIMARY KEY  (`ID_TAG`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=25 ;

--
-- Volcar la base de datos para la tabla `TAGS`
--

INSERT INTO `TAGS` (`ID_TAG`, `TAG`) VALUES
(15, 'Secuencias'),
(16, 'Ficheros'),
(17, 'Filesystem'),
(18, 'Disco'),
(19, 'Objetos'),
(20, 'Export'),
(21, 'Rendimiento'),
(22, 'LOGs'),
(23, 'SQLPlus'),
(24, 'Bucles');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `USER_STATUS`
--

DROP TABLE IF EXISTS `USER_STATUS`;
CREATE TABLE IF NOT EXISTS `USER_STATUS` (
  `ID_STATUS` tinyint(2) NOT NULL,
  `STATUS` varchar(25) character set utf8 NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcar la base de datos para la tabla `USER_STATUS`
--

INSERT INTO `USER_STATUS` (`ID_STATUS`, `STATUS`) VALUES
(1, 'USER'),
(2, 'ADMIN');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `USUARIOS`
--

DROP TABLE IF EXISTS `USUARIOS`;
CREATE TABLE IF NOT EXISTS `USUARIOS` (
  `ID_USUARIO` tinyint(3) NOT NULL,
  `USUARIO` varchar(25) character set utf8 NOT NULL,
  `PASS` varchar(100) character set utf8 NOT NULL,
  `ID_STATUS` tinyint(2) NOT NULL,
  `ACTIVO` tinyint(1) NOT NULL,
  PRIMARY KEY  (`ID_USUARIO`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcar la base de datos para la tabla `USUARIOS`
--

INSERT INTO `USUARIOS` (`ID_USUARIO`, `USUARIO`, `PASS`, `ID_STATUS`, `ACTIVO`) VALUES
(1, 'LUISMI', '95964d35e40f97df2a2b849151772d11', 1, 0),
(2, 'JPRIETO', '6a552e8af99d6466a44b4a20ed0ee3f5', 1, 0),
(3, 'A', '0cc175b9c0f1b6a831c399e269772661', 1, 0);
